package gui;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.text.MaskFormatter;

import bd.ConsultasTableModel;
import bd.Fechas;
import bd.Resultado;
import bd.Servicios;

/**
 * This code was edited or generated using CloudGarden's Jigloo SWT/Swing GUI
 * Builder, which is free for non-commercial use. If Jigloo is being used
 * commercially (ie, by a corporation, company or business for any purpose
 * whatever) then you should purchase a license for each developer using Jigloo.
 * Please visit www.cloudgarden.com for details. Use of Jigloo implies
 * acceptance of these licensing terms. A COMMERCIAL LICENSE HAS NOT BEEN
 * PURCHASED FOR THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED LEGALLY FOR
 * ANY CORPORATE OR COMMERCIAL PURPOSE.
 */
public class VentanaCajero extends javax.swing.JInternalFrame {
	private JLabel jnombre;
	private JLabel jsaldo;
	private JPanel jPanel2;
	private Servicios serv;
	private JScrollPane jScrollPane;
	private JLabel lblfecha2;
	private JButton btnClear;
	private JLabel lblFecha1;
	private JFormattedTextField fechaMayor;
	private JFormattedTextField fechaMenor;
	private JButton btnRefresh;
	private JTable tabla;

	/**
	 * Auto-generated main method to display this JInternalFrame inside a new
	 * JFrame.
	 */
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		VentanaCajero inst = new VentanaCajero();
		JDesktopPane jdp = new JDesktopPane();
		jdp.add(inst);
		jdp.setPreferredSize(inst.getPreferredSize());
		frame.setContentPane(jdp);
		frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		frame.pack();
		frame.setVisible(true);
	}

	public VentanaCajero() {
		super();
		initGUI();
		serv = Servicios.getServicios();
	}

	private void initGUI() {
		try {
			this.setPreferredSize(new java.awt.Dimension(741, 471));
			this.setBounds(0, 0, 741, 471);
			this.setVisible(false);

			{
				jScrollPane = new JScrollPane();
				getContentPane().add(jScrollPane, BorderLayout.CENTER);
				{
					TableModel tablaModel = new DefaultTableModel(
							new String[][] { {}, {} }, new String[] {});
					tabla = new JTable();
					tabla.setAutoCreateRowSorter(true);
					jScrollPane.setViewportView(tabla);
					tabla.setModel(tablaModel);
				}
			}
			{
				jPanel2 = new JPanel();
				getContentPane().add(jPanel2, BorderLayout.NORTH);
				jPanel2.setPreferredSize(new java.awt.Dimension(609, 82));
				jPanel2.setLayout(null);
				{
					jsaldo = new JLabel();
					jPanel2.add(jsaldo);
					jsaldo.setText("Saldo Actual: ");
					jsaldo.setBounds(12, 48, 581, 34);
				}
				{
					jnombre = new JLabel();
					jPanel2.add(jnombre);
					jnombre.setBounds(12, 12, 581, 36);
				}
				{
					btnRefresh = new JButton();
					jPanel2.add(btnRefresh);
					btnRefresh.setText("Buscar");
					btnRefresh.setBounds(573, 17, 100, 26);
					btnRefresh.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							String aux1 = fechaMenor.getText()
									.replace("/", " ");
							java.util.StringTokenizer tokens = new java.util.StringTokenizer(
									aux1);
							aux1 = "";
							while (tokens.hasMoreTokens()) {
								aux1 += " " + tokens.nextToken();
							}
							aux1 = aux1.toString();
							String aux2 = fechaMayor.getText()
									.replace("/", " ");
							tokens = new java.util.StringTokenizer(aux2);
							aux2 = "";
							while (tokens.hasMoreTokens()) {
								aux2 += " " + tokens.nextToken();
							}
							aux2 = aux2.toString();
							if (!aux1.isEmpty() && !aux2.isEmpty()) {
								java.sql.Date menor = Fechas
										.convertirStringADateSQL(fechaMenor
												.getText().trim());
								java.sql.Date mayor = Fechas
										.convertirStringADateSQL(fechaMayor
												.getText().trim());
								if (menor.after(mayor)) {
									JOptionPane.showMessageDialog(
											(Component) evt.getSource(),
											"La Fecha Menor debe ser menor a la Fecha Mayor. ",
											"Fechas inválidas.",
											JOptionPane.ERROR_MESSAGE);
								} else {
									refreshFechas();
								}
							} else {
								JOptionPane.showMessageDialog(
										(Component) evt.getSource(),
										"Ingrese fechas para poder realizar la búsqueda. ",
										"Fechas inválidas.",
										JOptionPane.ERROR_MESSAGE);
							}
						}
					});
				}
				{
					fechaMenor = new JFormattedTextField(new MaskFormatter(
							"##'/##'/####"));
					jPanel2.add(fechaMenor);
					fechaMenor.setBounds(388, 19, 144, 23);
				}
				{
					fechaMayor = new JFormattedTextField(new MaskFormatter(
							"##'/##'/####"));
					jPanel2.add(fechaMayor);
					fechaMayor.setBounds(388, 47, 144, 23);
				}
				{
					lblFecha1 = new JLabel();
					jPanel2.add(lblFecha1);
					lblFecha1.setText("Fecha Menor");
					lblFecha1.setBounds(289, 22, 99, 21);
				}
				{
					lblfecha2 = new JLabel();
					jPanel2.add(lblfecha2);
					lblfecha2.setText("Fecha Mayor");
					lblfecha2.setBounds(289, 51, 87, 19);
				}
				{
					btnClear = new JButton();
					jPanel2.add(btnClear);
					btnClear.setText("Mostrar Todo");
					btnClear.setBounds(573, 47, 103, 25);
					btnClear.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							refresh();
						}
					});
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void refresh() {
		jnombre.setText("Tarjeta: " + serv.getTarjeta());
		jsaldo.setText("Saldo Actual: " + serv.getSaldo(serv.getTarjeta()));

		Resultado r = serv
				.realizarConsulta("SELECT fecha, hora, tipo, monto, caja, destino FROM Tarjeta, trans_cajas_ahorro WHERE nro_tarjeta="
						+ serv.getTarjeta()
						+ " and nro_ca = caja_ahorro ORDER BY fecha DESC LIMIT 15");

		if (r.fueExitoso()) {
			rellenarTabla(r);
		} else {
			JOptionPane.showMessageDialog(
					SwingUtilities.getWindowAncestor(this), r.getExcepcion()
							+ "\n", "Error al ejecutar la consulta. \n",
					JOptionPane.ERROR_MESSAGE);
		}

	}

	private void rellenarTabla(Resultado r) {
		ConsultasTableModel modelo = new ConsultasTableModel();

		String[] columnas = r.getColumnas();
		String[] tipo = r.getTipos();

		try {
			for (int i = 0; i < columnas.length; i++) {
				String columnaNombre = columnas[i];
				Class columnaTipo;
				if (tipo[i].equals("java.sql.Time"))
					columnaTipo = Class.forName("java.lang.String");
				else
					columnaTipo = Class.forName(tipo[i]);

				boolean columnaEditable = false;
				modelo.agregarColumna(columnaNombre, columnaTipo,
						columnaEditable);
			}

			tabla.setModel(modelo);

			boolean negativo = false;
			Vector<Object[]> filas = r.getFilas();

			for (Object[] f : filas)
				if (f != null) {
					Vector<Object> fila = new Vector<Object>();
					for (int j = 0; j < columnas.length; j++) {
						if (columnas[j].equals("tipo")) {
							String t = (String) f[j];
							if (!t.equals("deposito"))
								negativo = true;
							fila.add(t);
						} else if (columnas[j].equals("monto")) {
							BigDecimal monto = (BigDecimal) f[j];

							if (negativo) {
								monto = monto.multiply(new BigDecimal("-1"));
								negativo = false;
							}

							fila.add(monto);
						} else
							fila.add(f[j]);
					}
					((ConsultasTableModel) this.tabla.getModel()).addRow(fila);
				}

		} catch (ClassNotFoundException e) {

		}

	}

	public void refreshFechas() {
		if (this.validarCampos()) {
			java.sql.Date fechaMenor = Fechas
					.convertirStringADateSQL(this.fechaMenor.getText().trim());
			java.sql.Date fechaMayor = Fechas
					.convertirStringADateSQL(this.fechaMayor.getText().trim());

			jnombre.setText("Tarjeta: " + serv.getTarjeta());
			jsaldo.setText("Saldo Actual: " + serv.getSaldo(serv.getTarjeta()));

			Resultado r = serv
					.realizarConsulta("SELECT fecha, hora, tipo, monto, caja, destino FROM Tarjeta, trans_cajas_ahorro WHERE nro_tarjeta="
							+ serv.getTarjeta()
							+ " and nro_ca = caja_ahorro "
							+ "and fecha between '"
							+ fechaMenor
							+ "' and  '"
							+ fechaMayor + "' ORDER BY fecha DESC");

			if (r.fueExitoso()) {
				rellenarTabla(r);
			} else {
				JOptionPane.showMessageDialog(
						SwingUtilities.getWindowAncestor(this),
						r.getExcepcion() + "\n",
						"Error al ejecutar la consulta.",
						JOptionPane.ERROR_MESSAGE);
			}

		}
	}

	private boolean validarCampos() {
		String mensajeError = null;

		if (this.fechaMenor.getText().isEmpty()) {
			mensajeError = "Debe ingresar un valor para el campo 'Fecha Menor'.";
		} else if (!Fechas.validar(this.fechaMenor.getText().trim())) {
			mensajeError = "En el campo 'Fecha Menor' debe ingresar un valor con el formato dd/mm/aaaa.";
		}
		if (this.fechaMayor.getText().isEmpty()) {
			mensajeError = "Debe ingresar un valor para el campo 'Fecha Mayor'.";
		} else if (!Fechas.validar(this.fechaMayor.getText().trim())) {
			mensajeError = "En el campo 'Fecha Mayor' debe ingresar un valor con el formato dd/mm/aaaa.";
		}

		if (mensajeError != null) {
			JOptionPane.showMessageDialog(this, mensajeError, "Error",
					JOptionPane.ERROR_MESSAGE);
			return false;
		}
		return true;
	}

}
